package com.sugon.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * 备件需求计划明细实体
 * 表名 SPARE_PART_REQU_DETAIL
 *
 * @author YuXD
 * @date 2020-08-31 11:25:05
 */
@Data
public class SparePartRequDetailEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 计划单价
     */
    private Double planPrice;

    /**
     * 预计使用时间
     * 过程计划：由车间制定时，为预计使用时间
     * 终版计划：由备件专员更新订单生成时间后，由系统根据订单生成时间+这个备件种类的采购周期计算后回填
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date planeTime;

    /**
     * 获取预计使用时间字符串格式
     *
     * @return
     */
    public String getPlanTimeStr() {
        return DateUtil.formatDate(this.planeTime);
    }

    /**
     * 需求数量
     */
    @Excel(name = "需求", width = 10, orderNum = "10", type = 10)
    private Integer demandNum;
    /**
     * 物料编码
     */
    @Excel(name = "备件编码", width = 16, orderNum = "4")
    private String materialCode;

    /**
     * 物料编码
     */
    private String materialId;

    /**
     * 计划编码
     */
    private String planCode;

    /**
     * 备件需求计划ID
     */
    private String planId;

    /**
     * $column.comments
     */
    private String id;
    /**
     * 最近一次修改时间
     */
    private Date gmtModified;
    /**
     * 创建时间
     */
    private Date gmtCreate;
    /**
     * 备注
     */
    @Excel(name = "备注", width = 35, orderNum = "12")
    private String remark;

    /**
     * 提需求时的背景
     */
    private String background;

    /**
     * 已入库数
     */
    private Integer inboundNum;
    /**
     * 在途数
     * 刚创建计划未审批通过： 0
     * 审批通过后在途数=需求数
     * 入库后在途数= 需求数 - 入库数
     */
    @Excel(name = "在途", width = 10, orderNum = "11", type = 10)
    private Integer transitNum;

    /**
     * 是否取消在途
     * 0:未取消
     * 1:已取消
     */
    private Integer isCancelTransit;

    /**
     * 需求明细编制人，用来记录当前备件需求明细是谁添加的
     */
    private String organUser;

    /**
     * 备件的实际需求部门或车间ID
     */
    private String applyDept;

    /**
     * 业务编码
     * 是备件管理员根据自有的一套编码规则，进行编制，编制完成后
     * 会发送给厂家，厂家在送货时需要提供给备件专员以便作为唯一标识
     */
    @Excel(name = "计划编码", width = 35, orderNum = "7")
    private String businessCode;

    /**
     * 订单生成时间：年月日
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date orderGenerateTime;

    /**
     * 预计到货时间：年月日
     */
    @Excel(name = "预计到货时间", width = 15, orderNum = "8", format = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date arriveTime;

    /**
     * 最开始客户要求：最近一次实际到货时间
     * 现在：不管这个备件需求计划明细最终到货几次，只记录第一次的
     */
    @Excel(name = "最近一次到货时间", width = 15, orderNum = "9", format = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date actualArriveTime;

    /*************************VO字段****************************/

    /**
     * 设备类型：按客户要求，提备件需求计划明细时一同传递
     */
    private String devType;

    /**
     * 设备类型名称：按客户要求，提备件需求计划明细时一同传递
     */
    private String devTypeName;

    /**
     * 备件图片：按客户要求，提备件需求计划明细时一同传递
     */
    private String reserve2;

    /**
     * 需求项状态
     * 已超期，红色
     * 7天内过去 黄色
     */
    private String needsItemStatus;

    public String getNeedsItemStatus() {
        if (NumberUtil.equals(this.transitNum, 0)) {
            return "green";
        } else {
            if (this.arriveTime != null) {
                DateTime now = DateUtil.date();
                if (DateUtil.compare(now, DateUtil.endOfDay(this.arriveTime)) >= 0) {
                    return "red";
                } else {
                    if (DateUtil.betweenDay(now, this.arriveTime, true) <= 7) {
                        return "yellow";
                    }
                }
            }
        }
        return "";
    }

    /**
     * 获取预计使用时间字符串格式
     *
     * @return
     */
    public String getOrderGenerateTimeStr() {
        if (this.orderGenerateTime != null) {
            return DateUtil.formatDate(this.orderGenerateTime);
        } else {
            return null;
        }
    }

    public Double getMoney() {
        if (this.planPrice != null && this.demandNum != null) {
            return this.planPrice * this.demandNum;
        }
        return 0.0;
    }

}
